﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using RESTVentas.Dominio;
using System.Data.SqlClient;
using System.ServiceModel;

namespace RESTVentas.Persistencia
{
    public class VentaDAO
    {
        public Venta Crear(Venta objACrear)
        {
            Venta ObjCreado = null;
            try
            {
                int Pk = 0;
                using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
                {
                    string query = "SELECT isnull(MAX(IdVenta)+1,1) FROM Ventas";
                    using (SqlCommand sentencia = new SqlCommand(query, con))
                    {
                        Pk = (int)sentencia.ExecuteScalar();
                    }
                }

                using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
                {
                    string query = "INSERT INTO Ventas VALUES(@idventa,@idcliente,@idproducto,@direccion,@cantidad,@total,@fechaRegistro,@estado,@observacion)";
                    objACrear.idventa= Pk;
                    using (SqlCommand com = new SqlCommand(query, con))
                    {
                        com.Parameters.Add(new SqlParameter("@idventa", objACrear.idventa));
                        com.Parameters.Add(new SqlParameter("@idcliente", objACrear.Cliente.idCliente));
                        com.Parameters.Add(new SqlParameter("@idproducto", objACrear.Producto.IdProducto));
                        com.Parameters.Add(new SqlParameter("@direccion", objACrear.direccion));
                        com.Parameters.Add(new SqlParameter("@cantidad", objACrear.cantidad));
                        com.Parameters.Add(new SqlParameter("@total", objACrear.total));
                        com.Parameters.Add(new SqlParameter("@fechaRegistro", objACrear.fechaRegistro));
                        com.Parameters.Add(new SqlParameter("@estado", objACrear.estado));
                        com.Parameters.Add(new SqlParameter("@observacion", objACrear.observacion));
                        com.ExecuteNonQuery();
                    }
                }
                ObjCreado = obtener(objACrear.idventa.ToString());
                return ObjCreado;
            }

            catch (Exception ex)
            {
                throw ex;
            }
        }

        public Venta obtener(string strPk)
        {
            try
            {
                Venta objEncontrado = null;
                string sql = "SELECT  v.idventa,v.idcliente,v.idproducto,v.direccion,v.cantidad,v.total,v.fechaRegistro,v.estado,v.observacion,c.idCliente ";
                sql = sql + ",c.txtClienteNombre,c.txtClienteApellido,c.NumDocumento,c.Activo,p.IdProducto,p.txtProducto ";
                sql = sql + "FROM Ventas v INNER JOIN dbo.Cliente c ON v.idcliente = c.idCliente INNER JOIN dbo.Producto p ON v.idproducto=p.IdProducto where v.idventa="+ strPk;

                using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
                {
                    con.Open();
                    using (SqlCommand com = new SqlCommand(sql, con))
                    {
                        com.Parameters.Add(new SqlParameter("@idVenta", strPk));
                        using (SqlDataReader res = com.ExecuteReader())
                        {
                            if (res.Read())
                            {
                                Cliente c = new Cliente()
                                {
                                    idCliente = (int)res["idcliente"]
                                    ,
                                    txtClienteNombre = (string)res["txtClienteNombre"]
                                    ,
                                    txtClienteApellido = (string)res["txtClienteApellido"]
                                    ,
                                    NumDocumento = (string)res["NumDocumento"]
                                };                               
                                Producto pr = new Producto
                                {
                                    IdProducto = (int)res["idproducto"]
                                    ,
                                    txtProducto = (string)res["txtProducto"]
                                };
                                objEncontrado = new Venta()
                                {
                                    idventa = (int)res["idVenta"],
                                    Cliente = c,
                                    Producto = pr,
                                    direccion = (string)res["direccion"],
                                    cantidad = (int)res["cantidad"],
                                    total = (int)res["total"],
                                    fechaRegistro = (DateTime)res["fechaRegistro"],
                                    estado = (string)res["estado"],
                                    observacion = (string)res["observacion"]
                                };
                            }
                        }
                    }
                }
                return objEncontrado;
            }

            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<Venta> ListarTodos()
        {
            try
            {
                List<Venta> list = new List<Venta>();
                string sql = "SELECT  v.idventa,v.idcliente,v.idproducto,v.direccion,v.cantidad,v.total,v.fechaRegistro,v.estado,v.observacion,c.idCliente ";
                sql = sql + ",c.txtClienteNombre,c.txtClienteApellido,c.NumDocumento,c.Activo,p.IdProducto,p.txtProducto ";
                sql = sql + "FROM Ventas v INNER JOIN dbo.Cliente c ON v.idcliente = c.idCliente INNER JOIN dbo.Producto p ON v.idproducto=p.IdProducto";

                using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
                {
                    con.Open();
                    using (SqlCommand com = new SqlCommand(sql, con))
                    {
                        using (SqlDataReader res = com.ExecuteReader())
                        {
                            while (res.Read())
                            {
                                Cliente c = new Cliente()
                                {
                                    idCliente = (int)res["idcliente"]
                                    ,
                                    txtClienteNombre = (string)res["txtClienteNombre"]
                                    ,
                                    txtClienteApellido = (string)res["txtClienteApellido"]
                                    ,
                                    NumDocumento = (string)res["NumDocumento"]
                                };
                                Producto pr = new Producto
                                {
                                    IdProducto = (int)res["idproducto"]
                                    ,
                                    txtProducto = (string)res["txtProducto"]
                                };
                                Venta v = new Venta()
                                {
                                    idventa = (int)res["idVenta"],
                                    Cliente = c,
                                    Producto = pr,
                                    direccion = (string)res["direccion"],
                                    cantidad = (int)res["cantidad"],
                                    total = (int)res["total"],
                                    fechaRegistro = (DateTime)res["fechaRegistro"],
                                    estado = (string)res["estado"],
                                    observacion = (string)res["observacion"]
                                };
                                list.Add(v);
                            }
                        }
                    }
                }
                return list;
            }

            catch (Exception ex)
            {
                throw ex;
            }
        }

        public Venta Modificar(Venta objAModificar)
        {
            Venta objModificado = null;
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                string sql = "UPDATE Ventas SET idcliente = @idcliente,idproducto = @idproducto,direccion = @direccion,cantidad = @cantidad";
                sql = sql + ",total = @total,estado = @estado,observacion = @observacion ";
                sql = sql + "WHERE idventa=@idventa";
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@idventa", objAModificar.idventa));
                    com.Parameters.Add(new SqlParameter("@idcliente", objAModificar.Cliente.idCliente));
                    com.Parameters.Add(new SqlParameter("@idproducto", objAModificar.Producto.IdProducto));
                    com.Parameters.Add(new SqlParameter("@direccion", objAModificar.direccion));
                    com.Parameters.Add(new SqlParameter("@cantidad", objAModificar.cantidad));
                    com.Parameters.Add(new SqlParameter("@total", objAModificar.total));
                    com.Parameters.Add(new SqlParameter("@estado", objAModificar.estado));
                    com.Parameters.Add(new SqlParameter("@observacion", objAModificar.observacion));
                    com.ExecuteNonQuery();
                }
            }
            objModificado = obtener(objAModificar.idventa.ToString());
            return objModificado;
        }
    }
}